#coding=utf-8

require "aio/core"

class Aio::Module::SpecialStyle::CompareOld < Aio::Module::SpecialStyle
  include Aio::Module

  include Aio::Ui::Verbose

  # 用于传递已经分析好的现有的device
  attr_accessor :device_manager

  # 用于传递由XML，Json生成并已经解析的Hash值
  attr_accessor :input_benchmark

  def initialize
    super({
      :author		=> "Elin",
      :description => "此模块用于解析两个Hash值的不同点,并发出警告，此模块废弃",
    })
  end

  def parse
    # 将device_manager 中的按照{device_name => useful} 形式重新编排
    # cmds_useful为深度克隆信息，对本体无影响
    device_warning = {}
    total = device_manager.devices_number
    print_good "总共 #{total} 台设备进行比较"

    device_manager.each_devices_with_index do |device_name, device_klass, i|

      device_warning[device_name] = Aio::Base::Toolkit::DeepClone.clone(device_klass.cmds_useful)
      # 进度条
      progress_bar(total, i+1, device_name)

    end

    clear_line
    clear_other_info(device_warning, input_benchmark)
    delete(device_warning, input_benchmark)
  end

  # 只留下要比较的两个数据有共同命令的交集,其他的命令就丢弃
  # 因为即使是保留了,产生的也是大量的垃圾信息
  def clear_other_info(device_warning, input_benchmark)
    device_arr = {}
    input_arr  = {}

    # 获得命令信息
    device_warning.each_pair 	{ |k, v| device_arr[k] = v.keys }
    input_benchmark.each_pair { |k, v| input_arr[k]  = v.keys }

    # 删除 device_warning 中多余的命令信息
    device_warning.each_pair do |name, hash|
      hash.delete_if do |k, v|
        next true unless input_arr.has_key?(name)
        input_arr[name].include?(k) ? false : true
      end
    end

    # 删除 input_benchmark 中多余的命令信息
    input_benchmark.each_pair do |name, hash|
      hash.delete_if do |k, v|
        next true unless device_arr.has_key?(name)
        device_arr[name].include?(k) ? false : true
      end
    end
  end

  def delete(cm1, cm2)
    compare = Aio::Config::Warning::Compare
    
    cm1.delete_if do |key, val|

      # 当末端是Hash时，迭代循环
      if val.class == Hash
        # 保证无论是Symbol 还是 String 都能互换
        # 有可能整个val都不一样
        unless cm2.has_key?(key)
          cm2_val = cm2[key.to_sym] if key.kind_of? String
          cm2_val = cm2[key.to_s]   if key.kind_of? Symbol
          next if cm2_val.nil?
        else
          cm2_val = cm2[key]
        end
        res = delete(cm1[key], cm2_val)
        # 当有内容时，说明存在差异，则保留
        res.empty? ? true : false
      else

        # 当末端不是Hash时,判断是否相等

        unless cm2.has_key?(key)
          cm2_val = cm2[key.to_sym] if key.kind_of? String
          cm2_val = cm2[key.to_s]   if key.kind_of? Symbol
          next if cm2_val.nil?
        else
          cm2_val = cm2[key]
        end

        #cm1[key].eql?(cm2_val)
        # 当配置中有信息时，那么只有当大于配置中的区间波动才会被记录
        # 当有Pass值的时候，直接Pass
        # 只有是数值才可以
        if compare.has_key?(key)
          compare[key] == "pass" ? true : (cm1[key].to_i < cm2_val.to_i + compare[key])
        else

          if cm1[key].eql?(cm2_val)
            true
          else
            cm1[key].compare_val = cm2_val
            false
          end
        end
      end
    end
  end

end
